package com.bjc.netty.c6;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;

import static com.bjc.netty.c6.TestByteBuf.log;

/**
 * @program: nettypro
 * @description: slice实现零拷贝  将一整个ByteBuf分成多个小的ByteBuf
 * @author: bjc
 * @create: 2021-09-24 21:07
 */
public class TestSlice {

    public static void main(String[] args) {
        ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(10);
        buf.writeBytes(new byte[]{'a','b','c','d','e','f','g','h','i','j'});
        log(buf);

        //在切片过程中，没有发生数据复制
        //TODO 注意 切片后的buf 会有容量限制 不能再多加内容 否则会报错
        ByteBuf f1 = buf.slice(0, 5);
        //使f1的引用计数+1  这样就不会再buf.release(); 马上释放掉
        f1.retain();
        ByteBuf f2 = buf.slice(5, 5);
        log(f1);
        log(f2);

        System.out.println("释放原有的byteBuf内存");
        buf.release();
        log(f1);

        f1.release();
        /*System.out.println("===========");
        f1.setByte(0,'y');
        //下面这个证明改的是同一个内存数据
        log(f1);
        log(buf);*/
    }
}
